home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / mac / files / t_sys5 / 92052tar.gz / 920528.tar / remote_kbd.c < prev    next >
C/C++ Source or Header  |  1991-10-13  |  2KB  |  101 lines

  1. /* @(#) $Header: remote_kbd.c,v 1.12 91/10/11 18:56:35 deyke Exp $ */
  2.  
  3. #include <sys/types.h>
  4.  
  5. #include <stdio.h>
  6. #include <sys/socket.h>
  7. #include <unistd.h>
  8.  
  9. #include "global.h"
  10. #include "hpux.h"
  11. #include "buildsaddr.h"
  12. #include "main.h"
  13.  
  14. extern char  Prompt[];
  15.  
  16. static int  fkbd = -1;
  17. static int  flisten = -1;
  18.  
  19. static void accept_connection __ARGS((void *p));
  20.  
  21. /*---------------------------------------------------------------------------*/
  22.  
  23. int  dobye(argc, argv, p)
  24. int  argc;
  25. char  *argv[];
  26. void *p;
  27. {
  28.   if (fkbd >= 0) {
  29.     freopen("/dev/null", "r+", stdin);
  30.     freopen("/dev/null", "r+", stdout);
  31.     freopen("/dev/null", "r+", stderr);
  32.     off_read(fkbd);
  33.     fkbd = -1;
  34.   }
  35.   return 0;
  36. }
  37.  
  38. /*---------------------------------------------------------------------------*/
  39.  
  40. static void accept_connection(p)
  41. void *p;
  42. {
  43.  
  44.   char  buf[1024];
  45.   int  addrlen, fd;
  46.   struct sockaddr addr;
  47.  
  48.   addrlen = sizeof(addr);
  49.   if ((fd = accept(flisten, &addr, &addrlen)) < 0) return;
  50.   if (fkbd >= 0) {
  51.     sprintf(buf, "*** %s busy\n", Hostname);
  52.     write(fd, buf, strlen(buf));
  53.     close(fd);
  54.     return;
  55.   }
  56.   fflush(stdin);
  57.   fflush(stdout);
  58.   fflush(stderr);
  59.   dup2(fd, 0);
  60.   dup2(fd, 1);
  61.   dup2(fd, 2);
  62.   close(fd);
  63.   fkbd = 0;
  64.   on_read(fkbd, (void (*)()) keyboard, (void *) 0);
  65.   printf(Prompt, Hostname);
  66. }
  67.  
  68. /*---------------------------------------------------------------------------*/
  69.  
  70. void remote_kbd_initialize()
  71. {
  72.  
  73. #if (defined(hpux)||defined(__hpux))
  74. #define NETKBD_SOCKET "unix:/tcp/.sockets/netkbd"
  75. #else
  76. #define NETKBD_SOCKET "*:4720"
  77. #endif
  78.  
  79.   int  addrlen;
  80.   int  arg;
  81.   struct sockaddr *addr;
  82.  
  83.   if (!(addr = build_sockaddr(NETKBD_SOCKET, &addrlen))) return;
  84.   if ((flisten = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) return;
  85.   switch (addr->sa_family) {
  86.   case AF_UNIX:
  87.     if (!Debug) unlink(addr->sa_data);
  88.     break;
  89.   case AF_INET:
  90.     arg = 1;
  91.     setsockopt(flisten, SOL_SOCKET, SO_REUSEADDR, (char *) &arg, sizeof(arg));
  92.     break;
  93.   }
  94.   if (bind(flisten, addr, addrlen) || listen(flisten, SOMAXCONN)) {
  95.     close(flisten);
  96.     return;
  97.   }
  98.   on_read(flisten, accept_connection, (void *) 0);
  99. }
  100.  
  101.